#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TAM_BUFFER 50

//coloquei fim_arquivo na struct porque estava dando conflito
typedef struct _BUFFER {
    char buff[TAM_BUFFER];
    int ind_buffer;
    int ind_arq;
    int sentinela;
    int fim_arquivo;
    
}BUFFER;

typedef struct _Parametros{
    char idParametro[TAM_BUFFER];
    char tipoParametro;         // i: integer, r: real, s: string, b: boolean, c: char
    char valRef;        //v: valor, r: referencia
}Parametros;

typedef struct  _TabelaFunctionProcedure {        
    char idFuncProc[TAM_BUFFER];
    Parametros parametros[50];
    char funcProc;      // f: function, p: procedure
    char tipoRetorno;   // i: integer, r: real, s: string, b: boolean, c: char
    int contParametros;
}TabelaFunctionProcedure;

int indTabela;  //Controla os indices da tabela de funcoes e procedimentos

BUFFER buffer;
TabelaFunctionProcedure tableFuncProc[TAM_BUFFER];

char tokenAtual[50];
char tokenPrev[50];
int contBegins;     //Esta variavel ira controlar o casamento de begins e ends ao longo do codigo. Sempre que encontrar um BEGIN, ela sera incrementada, sendo decrementada ao se encontrar um END



FILE *entrada;
FILE *saida;


void encherBuffer();

int AFDNumeros(char string[]);

int AFDOperadores(char string[]);

int literais(char string[]);

int variavel(char string[]);

int lexico();

int nexttoken();

char lerChar();

int checkAtribuicao();

int checkDeclFunction();

int checkDeclParametros();

int checkExpressaoAtribuicao();

int checkParametros(int indFuction);

int checkdeclaracao();

int checkprogram();

int isFunction();

int isInteger(int tipoToken);

int isLiteral(int tipoToken);

int isNumero(int tipoToken);

int isPReservada(int tipoToken);

int isPontovirgula();

int isTipoVariavel();

int isVariavel(int tipoToken);

int recursaoExpressao();
